import Vue from 'vue'
import Vuex from 'vuex'
import { addShopCart, getCode, getToken, getOrderList, getSearchList } from '@/api/requests.js'
import { set } from '../Storage/index.js'
// 导入数组排序的方法
// import compare from '@/uilts/compare.js'
// 导入vuex持久化的插件
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    // 购物车
    shopCart: [],
    // 历史搜索
    historyList: [],
    // 验证码
    code: '',
    // 判断验证码是否正确
    flag: null,
    // 用户信息
    userInfo: [],
    // 判断用户名是否能被使用
    userFlag: true,
    // 判断用户名是否存在
    hasUser: false,
    // 判断用户密码是否正确
    userOk: true,
    token: '',
    // 当前登入的用户名
    username: '',
    // 用户选中的地址
    checkAddress: {},
    // 订单页的全部订单
    orderList: [],
    // 控制用户结算的页面显示
    showSetOrderList: true,
    // 判断修改地址还是选择地址
    changeOrSeleted: null,
    // 搜索页商品数据
    searchList: [],
    // 用户选中的商品
    seletedProductList: []
  },
  getters: {
    // 计算出购物车中选中的商品
    seletedProduct(state) {
      return state.shopCart.filter((item) => item.seleted)
    },
    // 计算出选中商品的数量和价格
    price(state, getters) {
      return getters.seletedProduct.reduce((sum, item) => {
        return (sum += item.num * item.price)
      }, 0)
    },
    sum(state, getters) {
      return getters.seletedProduct.reduce((sum, item) => {
        return (sum += item.num)
      }, 0)
    },
    // 计算出当前登入的用户信息
    nowUser(state) {
      return state.userInfo.find((item) => state.username === item.phoneNum)
    },
    // 计算出用户的默认地址
    defaultAddress(state, getters) {
      return getters.nowUser.address.find((item) => item.isDefault) || {}
    },
    // 计算出订单中还没有支付的订单
    needPayOrder(state) {
      return state.orderList.filter(item => item.status === 1)
    },
    // 计算出订单中已经支付成功的订单
    okOrder(state) {
      return state.orderList.filter(item => item.status === 2)
    }
  },
  mutations: {
    ADDSHOPCART(state, data) {
      const flag = state.shopCart.some((item) => {
        if (item.name === data.name) {
          item.num += data.num
          if (item.num >= 10) {
            item.num = 10
          }
          return true
        } else {
          return false
        }
      })
      console.log(flag)
      if (flag === false) {
        state.shopCart.unshift(data)
      }
    },
    // 修改历史搜索
    CHANGEHISTORY(state, data) {
      const flag = state.historyList.some((item) => item === data)
      if (flag) {
        return true
      } else {
        state.historyList.unshift(data)
      }
    },
    // 清空历史搜索
    DELETEDHISTORY(state) {
      state.historyList = []
    },
    // 获取验证码
    GETCODE(state, data) {
      state.code = data
    },
    // 判断验证码是否正确
    CODEOK(state, userCode) {
      // eslint-disable-next-line eqeqeq
      state.code == userCode ? state.flag = true : state.flag = false
    },
    // 储存用户信息
    setUserInfo(state, data) {
      state.userFlag = true
      const flag = state.userInfo.some((item) => item.phoneNum === data.phoneNum)
      flag ? state.userFlag = false : state.userInfo.push(data)
    },
    // 修改是否有该用户
    CHANGEHASUSER(state, flag) {
      state.hasUser = flag
    },
    // 修改用户的密码判断
    CHANGEUSEROK(state, flag) {
      state.userOk = flag
    },
    // 获取token
    GETTOKEN(state, data) {
      state.token = data
    },
    // 修改用户名
    USERNAME(state, data) {
      state.username = data
    },
    // 添加用户的收货地址
    ADDADDRESS(state, data) {
      state.userInfo.some((item) => {
        if (state.username === item.phoneNum) {
          // 判断这次修改有没有修改默认地址
          if (data.isDefault === true) {
            item.address.forEach((item) => {
              item.isDefault = false
            })
          }
          item.address.unshift(data)
          if (item.address.length === 1) {
            item.address[0].isDefault = true
          }
          return true
        } else {
          return false
        }
      })
    },
    // 修改用户的地址
    CHANGEADDRESS(state, data) {
      // 先找到登入的用户
      state.userInfo.some(item => {
        if (item.phoneNum === state.username) {
          item.address.some(childrenItem => {
            if (childrenItem.id === data.id) {
              if (data.isDefault === true) {
                item.address.forEach((item) => {
                  item.isDefault = false
                })
              }
              Object.assign(childrenItem, data)
              return true
            } else {
              return false
            }
          })
          return true
        } else {
          return false
        }
      })
    },
    // 用户选中的地址
    CHECKEDADDRESS(state, data) {
      state.checkAddress = data
    },
    // 删除购物车中的商品
    REMOVEPRODUCT(state, i) {
      state.shopCart.splice(i, 1)
    },
    // 清除用户选中的地址
    CLEARCHECKEDADDRESS(state) {
      state.checkAddress = {}
    },
    // 添加订单
    ADDORDERLIST(state, data) {
      state.orderList.unshift(data)
    },
    // 删除订单
    removeOrderListById(state, id) {
      const index = state.orderList.findIndex(item => item.id === id)
      state.orderList.splice(index, 1)
    },
    // 修改订单状态
    CHANGEORDERSTATUS(state, id) {
      state.orderList.some(item => {
        if (item.id === id) {
          item.status = 2
          return true
        } else {
          return false
        }
      })
    },
    // 清空用户登入
    CLEARUSERNAME(state) {
      state.username = ''
    },
    // 根据id删除购物车中的数据
    CLEARSHOPCART(state, id) {
      const index = state.shopCart.findIndex(item => item.id === id)
      state.shopCart.splice(index, 1)
    },
    // 修改setOrder页是否显示数据
    CHANGESHOWORDER(state, booler) {
      state.showSetOrderList = booler
    },
    // 修改选择地址还是修改地址
    CHANGEORSELETED(state, type) {
      state.changeOrSeleted = type
    },
    // 删除地址
    DELETEDADDRESS(state, i) {
      state.userInfo.some(item => {
        if (item.phoneNum === state.username) {
          item.address.splice(i, 1)
          return true
        } else {
          return false
        }
      })
    },
    // 修改搜索商品数据
    GETSEARCHLIST(state, data) {
      state.searchList = data
    },
    // 获取用户选中的商品
    GETSELETEDLIST(state, value) {
      if (value === '全部商品') {
        state.seletedProductList = state.searchList
      } else {
        state.seletedProductList = state.searchList.filter(item => item.type.indexOf(value) !== -1)
      }
    },
    // 对商品进行销量排序
    XIAOLIANG(state) {
      state.seletedProductList.sort((a, b) => {
        return b.comment.one - a.comment.one
      })
    },
    // 对商品的价格进行排序
    CHANGEPRICE(state, num) {
      if (num === 1) {
        state.seletedProductList.sort((a, b) => {
          return b.price - a.price
        })
      } else {
        state.seletedProductList.sort((a, b) => {
          return a.price - b.price
        })
      }
    }

  },
  actions: {
    // 添加商品到购物车中
    async  addShopCart({ commit }, obj) {
      const res = await addShopCart()
      if (res.code === 200) {
        const { id } = res.data
        obj.id = id
        commit('ADDSHOPCART', obj)
        return true
      } else {
        return new Error('添加失败')
      }
    },
    // 获取验证码
    async getCode({ commit }) {
      const res = await getCode()
      commit('GETCODE', res.data.number)
      return res.data.number
    },
    // 用户登入获取token值
    async login(store, user) {
      // 判断用户是否存在
      const hasUser = store.state.userInfo.some((item) => item.phoneNum === user.phoneNum)
      if (hasUser) {
        store.state.hasUser = true
        // 判断用户账号密码是否正确
        const userOk = store.state.userInfo.some((item) => item.phoneNum === user.phoneNum && item.password === user.password)
        store.commit('CHANGEUSEROK', userOk)
        if (userOk) {
          const res = await getToken()
          // store.commit('GETTOKEN', res.token)
          store.commit('USERNAME', user.phoneNum)
          set('token', res.token)
          return 'ok'
        }
      } else {
        store.commit('CHANGEHASUSER', hasUser)
      }
    },
    // 手机登入获取token
    async phoneLogin(store, user) {
      // 判断用户是否存在
      const hasUser = store.state.userInfo.some((item) => item.phoneNum === user.phoneNum)
      store.commit('CHANGEHASUSER', hasUser)
      if (hasUser) {
        // 判断验证码是否正常
        store.commit('CODEOK', user.code)
        if (store.state.flag) {
          const res = await getToken()
          // store.commit('GETTOKEN', res.token)
          store.commit('USERNAME', user.phoneNum)
          set('token', res.token)
          return 'ok'
        }
      }
    },
    // 选择收货地址
    changeAddress(store, i) {
      const address = store.getters.nowUser.address.find((item, index) => index === i)
      store.commit('CHECKEDADDRESS', address)
    },
    // 添加订单
    async addOrderList({ commit }, data) {
      const order = {}
      // 订单有 订单id 生成时间 订单状态 订单信息
      const res = await getOrderList()
      Object.assign(order, res.data, data)
      commit('ADDORDERLIST', order)
      return res.data.id
    },
    // 根据id获取到支付页下正在进行支付的订单
    getOrderById(store, id) {
      return store.state.orderList.find(item => item.id === id)
    },
    // 获取搜索页数据
    async getSearchProductList({ commit }) {
      const res = await getSearchList()
      commit('GETSEARCHLIST', res.data)
    }

  },
  modules: {
  },
  // 配置vuex持久化插件
  plugins: [
    createPersistedState({
      storage: window.sessionStorage // 存储方式改为sessionStorage
    })
  ]

})
